package com.media.system.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 媒体文件实体
 * 
 * @author Claude
 * @since 2024-01-20
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("media_files")
@Schema(description = "媒体文件实体")
public class MediaFile extends BaseEntity {

    /**
     * 文件ID
     */
    @TableId(type = IdType.AUTO)
    @Schema(description = "文件ID")
    private Long fileId;

    /**
     * 上传用户ID
     */
    @NotNull(message = "上传用户ID不能为空")
    @Schema(description = "上传用户ID", required = true)
    private Long userId;

    /**
     * 家庭ID
     */
    @Schema(description = "家庭ID")
    private Long familyId;

    /**
     * 文件名
     */
    @NotBlank(message = "文件名不能为空")
    @Size(max = 255, message = "文件名长度不能超过255个字符")
    @Schema(description = "文件名", required = true)
    private String fileName;

    /**
     * 原始文件名
     */
    @Size(max = 255, message = "原始文件名长度不能超过255个字符")
    @Schema(description = "原始文件名")
    private String originalFileName;

    /**
     * 文件路径
     */
    @NotBlank(message = "文件路径不能为空")
    @Size(max = 500, message = "文件路径长度不能超过500个字符")
    @Schema(description = "文件路径", required = true)
    private String filePath;

    /**
     * 文件URL
     */
    @Size(max = 500, message = "文件URL长度不能超过500个字符")
    @Schema(description = "文件URL")
    private String fileUrl;

    /**
     * 文件类型
     */
    @NotBlank(message = "文件类型不能为空")
    @Size(max = 50, message = "文件类型长度不能超过50个字符")
    @Schema(description = "文件类型", required = true, allowableValues = {"image", "video", "audio", "document"})
    private String fileType;

    /**
     * 文件格式
     */
    @Size(max = 20, message = "文件格式长度不能超过20个字符")
    @Schema(description = "文件格式", example = "jpg")
    private String fileFormat;

    /**
     * MIME类型
     */
    @Size(max = 100, message = "MIME类型长度不能超过100个字符")
    @Schema(description = "MIME类型", example = "image/jpeg")
    private String mimeType;

    /**
     * 文件大小（字节）
     */
    @NotNull(message = "文件大小不能为空")
    @Schema(description = "文件大小（字节）", required = true)
    private Long fileSize;

    /**
     * 文件哈希值
     */
    @Size(max = 64, message = "文件哈希值长度不能超过64个字符")
    @Schema(description = "文件哈希值（MD5或SHA256）")
    private String fileHash;

    /**
     * 缩略图路径
     */
    @Size(max = 500, message = "缩略图路径长度不能超过500个字符")
    @Schema(description = "缩略图路径")
    private String thumbnailPath;

    /**
     * 缩略图URL
     */
    @Size(max = 500, message = "缩略图URL长度不能超过500个字符")
    @Schema(description = "缩略图URL")
    private String thumbnailUrl;

    /**
     * 文件宽度（像素）
     */
    @Schema(description = "文件宽度（像素）")
    private Integer width;

    /**
     * 文件高度（像素）
     */
    @Schema(description = "文件高度（像素）")
    private Integer height;

    /**
     * 持续时间（秒）
     */
    @Schema(description = "持续时间（秒，适用于音视频文件）")
    private BigDecimal duration;

    /**
     * 拍摄时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Schema(description = "拍摄时间")
    private LocalDateTime captureTime;

    /**
     * GPS纬度
     */
    @Schema(description = "GPS纬度")
    private BigDecimal latitude;

    /**
     * GPS经度
     */
    @Schema(description = "GPS经度")
    private BigDecimal longitude;

    /**
     * 拍摄地点
     */
    @Size(max = 200, message = "拍摄地点长度不能超过200个字符")
    @Schema(description = "拍摄地点")
    private String location;

    /**
     * 相机品牌
     */
    @Size(max = 100, message = "相机品牌长度不能超过100个字符")
    @Schema(description = "相机品牌")
    private String cameraMake;

    /**
     * 相机型号
     */
    @Size(max = 100, message = "相机型号长度不能超过100个字符")
    @Schema(description = "相机型号")
    private String cameraModel;

    /**
     * AI标签
     */
    @Size(max = 1000, message = "AI标签长度不能超过1000个字符")
    @Schema(description = "AI识别标签，JSON格式")
    private String aiTags;

    /**
     * 用户标签
     */
    @Size(max = 500, message = "用户标签长度不能超过500个字符")
    @Schema(description = "用户自定义标签，逗号分隔")
    private String userTags;

    /**
     * 文件状态
     */
    @Schema(description = "文件状态", allowableValues = {"0", "1", "2"})
    private Integer status;

    /**
     * 是否公开
     */
    @Schema(description = "是否公开", allowableValues = {"0", "1"})
    private Integer isPublic;

    /**
     * 喜爱标记
     */
    @Schema(description = "是否标记为喜爱", allowableValues = {"0", "1"})
    private Integer isFavorite;

    /**
     * 下载次数
     */
    @Schema(description = "下载次数")
    private Integer downloadCount;

    /**
     * 查看次数
     */
    @Schema(description = "查看次数")
    private Integer viewCount;
}